/*
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package net.sf.l2j.gameserver.model.base;

public class Experience
{
    public final static long LEVEL[]=
    {
                -1L, // level 0 (unreachable)
                 0L,
                68L,
               363L,
              1168L,
              2884L,
              6038L,
             11287L,
             19423L,
             31378L,
             48229L, // level 10
             71201L,
            101676L,
            141192L,
            191452L,
            254327L,
            331864L,
            426284L,
            539995L,
            675590L,
            835854L,  // level 20
           1023775L,
           1242536L,
           1495531L,
           1786365L,
           2118860L,
           2497059L,
           2925229L,
           3407873L,
           3949727L,
           4555766L, // level 30
           5231213L,
           5981539L,
           6812472L,
           7729999L,
           8740372L,
           9850111L,
          11066012L,
          12395149L,
          13844879L,
          15422851L, // level 40
          17137002L,
          18995573L,
          21007103L,
          23180442L,
          25524751L,
          28049509L,
          30764519L,
          33679907L,
          36806133L,
          40153995L, // level 50
          45524865L,
          51262204L,
          57383682L,
          63907585L,
          70852742L,
          80700339L,
          91162131L,
         102265326L,
         114038008L,
         126509030L, // level 60
         146307211L,
         167243291L,
         189363788L,
         212716741L,
         237351413L,
         271973532L,
         308441375L,
         346825235L,
         387197529L,
         429632402L, // level 70
         474205751L,
         532692055L,
         606319094L,
         696376867L,
         804219972L,
         931275828L,
        1151275834L,
        1511275834L,
        2099275834L,
        4200000000L, //level 80 
		6300000000L, //level 81
		8820000000L, //level 82
		11844000000L, //level 83
		15472800000L, //level 84
		19827360000L, //level 85
		25314000000L
    };
    
    /**
     * This is the first UNREACHABLE level for pets.<BR>
     * example: If you want a max at 80 & 100%, you have to set it to 81.<BR><BR>
     */
    public final static byte PET_MAX_LEVEL = 81;
    
    private final static int CLIENT_EXP_STEP_ABOVE_SUPPORTED_LEVEL = 50000;
    private final static byte MAX_CLIENT_SUPPORTED_LEVEL = 79;
    
    public final static int getVisualExp(int level, long exp)
	{
		if (level < MAX_CLIENT_SUPPORTED_LEVEL)
		{
			return (int) exp;
		}
		
		int levelDiff = level - MAX_CLIENT_SUPPORTED_LEVEL;
		long visualExp = LEVEL[MAX_CLIENT_SUPPORTED_LEVEL] + (CLIENT_EXP_STEP_ABOVE_SUPPORTED_LEVEL * levelDiff);
		
		long currentExpForLevel = exp - LEVEL[level];
		long totalExpForLevel = LEVEL[level + 1] - LEVEL[level];
		double expMultiplier = (double)currentExpForLevel / (double)totalExpForLevel;
		visualExp += Math.floor(CLIENT_EXP_STEP_ABOVE_SUPPORTED_LEVEL * expMultiplier);
		return (int) visualExp;
	}
}